home *** CD-ROM | disk | FTP | other *** search
- PAGE ,132
- TITLE ReadMac - View Macintosh Pictures on an IBM/PC (CGA or Hercules)
-
- COORD MACRO REG,ROW,COL
- MOV REG,(ROW*256)+COL
- ENDM
-
- CONFIG MACRO VAL
- MOV AL,VAL
- MOV DX,3BFH
- OUT DX,AL
- ENDM
-
- SCROLL EQU 10
-
- HOME EQU 71
- UPARROW EQU 72
- PAGEUP EQU 73
- ENDKEY EQU 79
- DNARROW EQU 80
- PAGEDN EQU 81
- CPRTSC EQU 114
- CEND EQU 117
- CPAGEDN EQU 118
- CHOME EQU 119
- CPAGEUP EQU 132
-
- BUFFER EQU IOBUF[8192]
-
- BIOS SEGMENT AT 40H
- ORG 65H
- CRTMODE LABEL BYTE
- BIOS ENDS
-
- CODE SEGMENT
-
- ASSUME CS:CODE,DS:CODE
-
- ORG 80H
-
- PARAM LABEL BYTE
-
- ORG 100H
-
- START: JMP MAIN
-
- MENU DB "Micro Technologies, Inc. Modified by SMG Software",13,10
- DB "921 Royal Heights Road Anaheim, CA",13,10
- DB "Belleville, IL 62223 13-Feb-1987",13,10
- DB " Voice: (618) 233-2314 Data: (618) 233-2315",13,10,10
- DB " ",18H," Moves picture UP one pixel row",13,10
- DB " PgUp Moves picture UP ten pixel rows",13,10
- DB " ^PgUp Moves picture UP by a Half-Screen",13,10
- DB " ",19H," Moves picture DOWN one pixel row",13,10
- DB " PgDn Moves picture DOWN ten pixel rows",13,10
- DB " ^PgDn Moves picture DOWN by a Half-Screen",13,10
- DB " ^Home Scroll to Top of Picture",13,10
- DB " ^End Scroll to Bottom of Picture",13,10
- DB " Home Jump to Top of Picture",13,10
- DB " End Jump to Bottom of Picture",13,10
- DB " ^U,U Select printer",13,10
- DB " ^O,O Install OTHER printer",13,10
- DB " ^P,^Q,P Select printer/Print picture",13,10
- DB " ^PrtSc Print Picture",13,10
- DB " L,H,? Load another picture",13,10
- DB "^E,E,Esc Return to DOS",13,10,10
- DB "Enter a quote (",34,") to view last picture",13,10,10
- DB "File name: $"
-
- ERR_MSG DB 13,10,"Non-graphics card found!",7,13,10,"$"
- LOAD_MSG DB 13,10,"Loading Picture: $"
- LOAD_ERR DB 13,10,"Unable to load "
- FILN_STR DB 81 DUP(0)
-
- GMODE DB 35H,2DH,2EH,07H
- DB 5BH,02H,57H,57H
- DB 02H,03H,00H,00H
-
- TMODE DB 61H,50H,52H,0FH
- DB 19H,06H,19H,19H
- DB 02H,0DH,0BH,0CH
-
- FILENAME LABEL BYTE
- DB 80
- FILN_LEN DB 0
- FILN_BUF DB 81 DUP(0)
-
- SCANCNT DB 2 ; Defaults for the CGA
- LINLEN DW 640
- SCRLEN DW 200
- VIDEO DW 0B800H
- LASTSCAN DW ?
-
- HERC DB 1
- HANDLE DW 0
-
- PSMENU DB 13,10,"Enter the following commands for your printer",13,10
- DB "Each command is 9 characters maximum",13,10
- DB "An ESCAPE code will be inserted before them",13,10,10
- DB "Set line spacing to 8/72 inch: $"
-
- PS1LEN DB 9
- PS1CNT DB 0
- PS1BUF DB 9 DUP(0)
-
- PSET2 DB 13,10
- DB "Send 576 graphic characters: $"
-
- PS2LEN DB 9
- PS2CNT DB 0
- PS2BUF DB 9 DUP(0)
-
- PSET3 DB 13,10
- DB "Set line spacing to 1/6 inch: $"
-
- PS3LEN DB 9
- PS3CNT DB 0
- PS3BUF DB 9 DUP(0)
-
- BYTE_CNT DW 0
- NEXT_PTR DW 0
- BUFPTR DW ?
- SCAN1 DW 0
- PRT_NUM DW 0
-
- PGMSTR DB 1BH,"A",8," " ; Setup for Epson
- DB 1BH,"*",4,64,2," "
- DB 1BH,"2 "
-
- DB 1BH,"T16 " ; Setup for Apple DMP/NEC 8023
- DB 1BH,"G0576 "
- DB 1BH,"B "
-
- DB 1BH,"3",16," " ; Setup for Gemini 10
- DB 1BH,"L",64,2," "
- DB 1BH,"2 "
-
- DB 1BH,"A",8," " ; Setup for IBM Printer
- DB 1BH,"L",64,2," "
- DB 1BH,"2 "
-
- PGMOTHR DB " " ; Setup for OTHER Printer
- DB " "
- DB " "
-
- PMENU DB 13,10
- DB "Choice of printers",13,10
- DB "1) Epson FX",13,10
- DB "2) Apple DMP/NEC 8023",13,10
- DB "3) Gemini 10",13,10
- DB "4) IBM Graphics Printer",13,10
- DB "5) Other (if installed)",13,10
- DB "Enter Choice (1-5): $"
-
- PRT_MSG DB 13,10,10,"Printing...$"
-
- MAC_EXT DB ".MAC"
-
- OTHER DB "OTHER.PRT",0
-
- MAIN: MOV SI,OFFSET PARAM ; Point to Parameter String
- LODSB ; Read Parameter String Length
- XOR AH,AH
- MOV CX,AX
- MAIN00: JCXZ MAIN05A ; If Length = 0, Skip
- LODSB ; Strip off Leading Whitespace
- DEC CX
- CMP AL,' '
- JE MAIN00
- CMP AL,9
- JE MAIN00
- CMP AL,'/' ; If a Switch is Found,
- JNE MAIN05
- LODSB ; Read Switch Letter
- DEC CX
- AND AL,0DFH ; Convert to Upper Case
- CMP AL,'H' ; If 'H', Use Hercules
- JNE MAIN01
- MOV HERC,-1
- MOV SCANCNT,4
- MOV LINLEN,720
- MOV SCRLEN,348
- MOV VIDEO,0B000H
- JMP SHORT MAIN04
- MAIN01: CMP AL,'C' ; Else if 'C', Use CGA
- JNE MAIN02
- MOV HERC,0
- JMP SHORT MAIN04
- MAIN02: DEC SI ; Else Interpret as Filename
- DEC CX
- JMP SHORT MAIN05
- MAIN04: JCXZ MAIN05A ; If Length = 0, Skip
- LODSB ; Strip off Leading Whitespace
- DEC CX
- CMP AL,' '
- JE MAIN04
- CMP AL,9
- JE MAIN04
- MAIN05: DEC SI ; ReUse Last Character
- INC CX
- MOV FILN_LEN,CL
- MOV DI,OFFSET FILN_BUF ; Read Filename into Buffer
- REP MOVSB
- MAIN05A: CMP HERC,1 ; If no Switch Option,
- JNE MAIN07
- MOV HERC,0
- INT 11H ; Test Display Adapter Type
- AND AX,30H ; If Not CGA,
- CMP AX,30H
- JNE MAIN07
- CONFIG 3 ; Configure to Full Mode
- MOV AX,0B800H ; If unable to write page 1,
- MOV ES,AX
- MOV ES:[0],5AA5H
- CMP ES:[0],5AA5H
- JE MAIN06 ; True Monochrome
- MOV AH,9 ; Output Error Message
- MOV DX,OFFSET ERR_MSG
- INT 21H
- MOV AX,4C01H ; Exit to DOS
- INT 21H
- MAIN06: MOV HERC,-1 ; Else Hercules Card
- MOV SCANCNT,4
- MOV LINLEN,720
- MOV SCRLEN,348
- MOV VIDEO,0B000H
- MAIN07: PUSH CS ; Extra Segment = Code Segment
- POP ES
- MOV AX,720 ; Calculate LastScan
- SUB AX,SCRLEN
- MOV LASTSCAN,AX
- CALL RD_OTHER ; Read OTHER.PRT
- MOV BX,OFFSET BUFFER ; Initialize Buffer Pointer
- MOV BUFPTR,BX
- CMP FILN_LEN,0 ; If No Filename,
- JNE MAIN09
- MAIN08: CALL SET_TMOD ; Set Text Mode
- MOV DX,OFFSET MENU ; Output Menu to Screen
- MOV AH,9
- INT 21H
- MOV DX,OFFSET FILENAME ; Read Filename
- MOV AH,0AH
- INT 21H
- MAIN09: MOV CL,FILN_LEN ; If no Entry,
- OR CL,CL
- JNZ MAIN10
- MAIN09A: MOV DX,OFFSET LOAD_ERR-1
- JMP MAIN43 ; Exit
- MAIN10: CMP CL,1 ; If Single Character,
- JNE MAIN12
- CMP FILN_BUF[0],'"' ; If Quote, Use Current Data
- JE MAIN15
- CMP FILN_BUF[0],15 ; Else if ^O,
- JNE MAIN11
- CALL PSETUP ; Install OTHER Printer
- MAIN08A: JMP SHORT MAIN08
- MAIN11: CMP FILN_BUF[0],21 ; Else if ^U,
- JNE MAIN11A
- CALL SEL_PRT ; Select Printer
- JMP SHORT MAIN08
- MAIN11A: CMP FILN_BUF[0],17
- JNE MAIN11B
- CALL SET_TMOD ; Select Text Mode
- CALL PRT_PIC ; Print Picture
- JMP SHORT MAIN08
- MAIN11B: CMP FILN_BUF[0],5 ; Else if ^E,
- JE MAIN09A ; Exit to DOS
- MAIN12: XOR CH,CH ; If no Extension,
- MOV DI,OFFSET FILN_BUF
- MOV AL,'.'
- REPNE SCASB
- JE MAIN13
- MOV SI,OFFSET MAC_EXT ; Append Extension ".MAC"
- MOV CX,4
- REP MOVSB
- ADD FILN_LEN,4
- MAIN13: MOV CL,FILN_LEN ; Copy Filename to String
- XOR CH,CH
- MOV SI,OFFSET FILN_BUF
- MOV DI,OFFSET FILN_STR
- REP MOVSB
- MOV AL,'$' ; Terminate Filename String
- STOSB
- XCHG DI,SI ; Terminate Filename Buffer
- MOV AL,0
- STOSB
- MOV DX,OFFSET LOAD_MSG ; Output Loading Message
- MOV AH,9
- INT 21H
- CALL OP_PICF ; Open Picture File
- JNC MAIN14 ; If Error,
- MOV DX,OFFSET LOAD_ERR ; Output Load Error Message
- JMP MAIN43 ; and Done
- MAIN14: CALL GET_PIC
- JNZ MAIN08A ; If Keystroke, Abort Load
- MAIN15: CALL SET_GMOD ; Set Graphics Mode
- MOV SCAN1,0 ; First Scan Line = 0
- MAIN16: CALL PIC_OUT ; Output the Picture
- MOV AH,0 ; Get Key Stroke
- INT 16H
- CALL BRK_CHK ; If ^C or ^Break, Abort
- CMP AH,UPARROW ; If UpArrw,
- JNE MAIN17
- DEC SCAN1
- MOV AX,SCAN1 ; Move Down One Scan Line
- CMP AX,0
- JGE MAIN16
- MOV SCAN1,0
- JMP SHORT MAIN16
- MAIN17: CMP AH,DNARROW ; If DnArrw,
- JNE MAIN18
- INC SCAN1 ; Move Up One Scan Line
- MOV AX,LASTSCAN
- CMP AX,SCAN1
- JG MAIN16
- MOV SCAN1,AX
- JMP SHORT MAIN16
- MAIN18: CMP AH,PAGEUP ; If PgUp,
- JNE MAIN21
- MOV BX,SCROLL
- MAIN19: SUB SCAN1,BX ; Move Down Ten Scan Lines
- JGE MAIN16
- MAIN20: MOV SCAN1,0
- JMP SHORT MAIN16
- MAIN21: CMP AH,PAGEDN ; If PgDn,
- JNE MAIN24
- MOV BX,SCROLL
- MAIN22: ADD SCAN1,BX ; Move Up Ten Scan Lines
- MOV AX,LASTSCAN
- CMP SCAN1,AX
- JLE MAIN16
- MAIN23: MOV SCAN1,AX
- JMP SHORT MAIN16
- MAIN24: CMP AH,CPAGEUP ; If Cntl-PgUp,
- JNE MAIN25
- MOV BX,SCRLEN ; Move Up by a Half-Screen
- SHR BX,1
- JMP SHORT MAIN19
- MAIN25: CMP AH,CPAGEDN ; If Cntl-PgDn,
- JNE MAIN26
- MOV BX,SCRLEN ; Move Down by a Half-Screen
- SHR BX,1
- JMP SHORT MAIN22
- MAIN26: CMP AH,HOME ; If Home,
- JNE MAIN27
- MOV SCAN1,0 ; Move to First Scan Line
- JMP MAIN16
- MAIN27: CMP AH,ENDKEY ; If End,
- JNE MAIN28
- MOV AX,LASTSCAN
- MOV SCAN1,AX ; Move to Last Scan Line
- JMP MAIN16
- MAIN28: CMP AH,CHOME ; If Cntl-Home,
- JNE MAIN32
- MAIN29: SUB SCAN1,SCROLL ; Scroll to End of Picture
- CMP SCAN1,0
- JLE MAIN20
- CALL KEY_CHK ; If Keystroke, Abort
- JZ MAIN31
- MAIN30: JMP MAIN16
- MAIN31: CALL PIC_OUT
- JMP SHORT MAIN29
- MAIN32: CMP AH,CEND ; If Cntl-End,
- JNE MAIN34
- MAIN33: MOV AX,SCROLL
- ADD SCAN1,AX ; Scroll to Top of Picture
- MOV AX,LASTSCAN
- CMP SCAN1,AX
- JGE MAIN23
- CALL KEY_CHK
- JNZ MAIN30
- CALL PIC_OUT
- JMP SHORT MAIN33
- MAIN34: CMP AH,CPRTSC ; If Cntl-PrtSc,
- JNE MAIN35
- CALL SET_TMOD ; Select Text Mode
- CALL PRT_PIC ; Print Picture
- JMP MAIN15
- MAIN35: CMP AL,'?' ; If '?' or ' ', Same as 'L'
- JE MAIN39
- CMP AL,' '
- JE MAIN39
- AND AL,0DFH ; Convert Key to Upper Case
- CMP AL,'P' ; If 'P', ^P or ^Q,
- JE MAIN35B
- CMP AL,16
- JE MAIN35B
- CMP AL,17
- JNE MAIN36
- MAIN35B: CALL SEL_PRT ; Select Printer
- JB MAIN35A
- CALL PRT_PIC ; Print Picture
- MAIN35A: JMP MAIN15
- MAIN36: CMP AL,'U' ; If 'U' or ^U,
- JE MAIN37
- CMP AL,21
- JNE MAIN38
- MAIN37: CALL SEL_PRT ; Select Printer
- JMP MAIN15
- MAIN38: CMP AL,'H' ; If 'H', 'L', ' ' or '?',
- JE MAIN39
- CMP AL,'L'
- JNE MAIN40
- MAIN39: JMP MAIN08 ; Load Next Picture
- MAIN40: CMP AL,'O' ; If 'O' or ^O,
- JE MAIN41
- CMP AL,15
- JNE MAIN42
- MAIN41: CALL PSETUP ; Install Printer
- JMP MAIN15
- MAIN42: MOV DX,OFFSET LOAD_ERR-1
- CMP AL,'E' ; If 'E' or ESC, Exit
- JE MAIN43
- CMP AL,5
- JE MAIN43
- CMP AL,1BH
- JE MAIN43
- JMP MAIN16 ; Else Ignore
- MAIN43: PUSH DX
- CALL SET_TMOD ; Set Text Mode
- POP DX ; Output Termination Message
- MOV AH,9
- INT 21H
- MOV AX,4C00H ; Exit to DOS
- INT 21H
-
- GET_PIC: CALL RD_PICF ; Read First Block
- JNZ GET_PIC8 ; If Keystroke, Abort Load
- MOV SI,OFFSET IOBUF[1] ; Output Picture Name
- LODSB
- XOR AH,AH
- MOV CX,AX
- GET_PIC1: LODSB
- MOV DL,AL
- MOV AH,2
- INT 21H
- LOOP GET_PIC1
- MOV NEXT_PTR,640 ; Skip First 640 Bytes
- MOV CX,720 ; Line Count = 720
- MOV BX,BUFPTR ; Point to Buffer
- GET_PIC2: MOV SI,0 ; Point to Beginning of Buffer
- MOV BYTE_CNT,0 ; Byte Count = 0
- PUSH CX ; Save Count
- GET_PIC3: CALL GET_BYTE ; Get a Byte from the File
- JNZ GET_PIC7 ; If Keystroke, Abort Load
- CMP AL,0 ; If Byte >= 0,
- JL GET_PIC5
- XOR AH,AH ; SubCount = Byte + 1
- MOV CX,AX
- INC CX
- GET_PIC4: CALL GET_STR ; Read String into Buffer
- JNZ GET_PIC7 ; If Keystroke, Abort Load
- JMP SHORT GET_PIC6
- GET_PIC5: MOV CL,AL ; Else SubCount = 101H - Byte
- XOR CH,CH
- MOV AX,101H
- SUB AX,CX
- MOV CX,AX
- CALL GET_BYTE ; Read Byte
- JNZ GET_PIC7 ; If Keystroke, Abort Load
- PUSH CX ; Fill Buffer with Byte
- PUSH DI
- MOV DI,SI
- ADD DI,BX
- REP STOSB
- POP DI
- POP CX
- ADD BYTE_CNT,CX
- ADD SI,CX
- GET_PIC6: MOV AX,BYTE_CNT ; Repeat until a Full Line
- CMP AX,72 ; has been read in
- JL GET_PIC3
- POP CX ; Repeat until all Lines
- ADD BX,72 ; have been read in
- LOOP GET_PIC2
- XOR AH,AH ; Reset Abort Flag
- PUSH CX
- GET_PIC7: POP CX
- GET_PIC8: RET ; Done
-
- GET_STR: PUSH CX ; Save Registers
- PUSH DI
- PUSH SI
- MOV DI,SI ; Read Data to End-of-Input
- ADD DI,BX
- MOV SI,OFFSET IOBUF
- ADD SI,NEXT_PTR
- MOV AX,8192
- SUB AX,NEXT_PTR
- CMP AX,CX
- JGE GET_STR1
- SUB CX,AX
- PUSH CX
- MOV CX,AX
- ADD BYTE_CNT,CX
- ADD NEXT_PTR,CX
- REP MOVSB
- CALL RD_PICF ; Read Next Block
- POP CX
- JNZ GET_STR2 ; If Keystroke, Abort Load
- MOV SI,OFFSET IOBUF ; Point to First Byte
- GET_STR1: ADD BYTE_CNT,CX ; Read Remainder of String
- ADD NEXT_PTR,CX
- REP MOVSB
- XOR AH,AH
- GET_STR2: POP SI ; Restore Registers
- POP DI
- POP CX
- PUSHF
- ADD SI,CX
- POPF
- RET ; Done
-
- GET_BYTE: PUSH SI ; Save Register
- MOV SI,NEXT_PTR ; Get Byte Pointer
- CMP SI,8192 ; If End of Buffer,
- JL GET_BYT1
- CALL RD_PICF ; Read Next Block
- MOV SI,0 ; Point to First Byte
- GET_BYT1: MOV AL,IOBUF[SI] ; Get Byte from Buffer
- INC NEXT_PTR ; Point to Next Byte
- PUSH AX
- CALL KEY_CHK ; Check for Keystroke
- POP AX
- POP SI ; Restore Register
- RET ; Done
-
- PSETUP: PUSH AX ; Save Registers
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH SI
- PUSH DI
- CALL SET_TMOD ; Set Text Mode
- MOV AX,0600H ; Clear Screen
- MOV BH,7
- COORD CX,0,0
- COORD DX,24,79
- INT 10H
- MOV DX,OFFSET PSMENU ; Output Printer Setup Menu
- MOV AH,9
- INT 21H
- MOV DX,OFFSET PS1LEN ; Read Response #1
- MOV AH,0AH
- INT 21H
- MOV AL,PS1CNT ; Terminate PS1
- MOV AH,0
- MOV SI,AX
- MOV PS1BUF[SI],' '
- MOV DX,OFFSET PSET2 ; Output Printer Setup Msg #2
- MOV AH,9
- INT 21H
- MOV DX,OFFSET PS2LEN ; Read Response #2
- MOV AH,0AH
- INT 21H
- MOV AL,PS2CNT ; Terminate PS2
- MOV AH,0
- MOV SI,AX
- MOV PS2BUF[SI],' '
- MOV DX,OFFSET PSET3 ; Output Printer Setup Msg #3
- MOV AH,9
- INT 21H
- MOV DX,OFFSET PS3LEN ; Read Response #3
- MOV AH,0AH
- INT 21H
- MOV AL,PS3CNT ; Terminate PS3
- MOV AH,0
- MOV SI,AX
- MOV PS3BUF[SI],' '
- MOV DI,0
- MOV SI,2
- MOV CX,9
- MOV PGMOTHR[DI],1BH ; Copy Strings to PGMOTHR
- INC DI
- PSETUP1: MOV AL,PS1LEN[SI]
- MOV PGMOTHR[DI],AL
- INC SI
- INC DI
- LOOP PSETUP1
- MOV DI,10
- MOV SI,2
- MOV CX,9
- MOV PGMOTHR[DI],1BH
- INC DI
- PSETUP2: MOV AL,PS2LEN[SI]
- MOV PGMOTHR[DI],AL
- INC SI
- INC DI
- LOOP PSETUP2
- MOV DI,20
- MOV SI,2
- MOV CX,9
- MOV PGMOTHR[DI],1BH
- INC DI
- PSETUP3: MOV AL,PS3LEN[SI]
- MOV PGMOTHR[DI],AL
- INC SI
- INC DI
- LOOP PSETUP3
- CALL WR_OTHER ; Write Install Info to File
- POP DI ; Restore Registers
- POP SI
- POP DX
- POP CX
- POP BX
- POP AX
- RET ; Done
-
- SEL_PRT: PUSH AX ; Save Registers
- PUSH BX
- PUSH DX
- CALL SET_TMOD ; Set Text Mode
- MOV DX,OFFSET PMENU ; Output Printer Menu
- MOV AH,9
- INT 21H
- MOV AH,0 ; Get Key Stroke
- INT 16H
- CALL BRK_CHK ; If ^C or ^Break, Abort
- CMP AL,'1' ; If Valid Entry,
- JL SEL_PRT2
- CMP AL,'5'
- JG SEL_PRT2
- SUB AL,'1'
- CBW
- CMP AX,4 ; If Other Selected,
- JNE SEL_PRT1
- CMP PGMOTHR,' ' ; and Other not Installed,
- JE SEL_PRT2 ; Error
- SEL_PRT1: MOV PRT_NUM,AX ; Save it
- CLC ; Reset Error Flag
- JMP SHORT SEL_PRT3
- SEL_PRT2: MOV AH,2 ; Else Beep
- MOV DL,7
- INT 21H
- STC ; Set Error Flag
- SEL_PRT3: POP DX ; Restore Registers
- POP BX
- POP AX
- RET ; Done
-
- PRT_PIC: PUSH AX ; Save Registers
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH SI
- PUSH DI
- MOV DX,OFFSET PRT_MSG ; Output Printer Menu
- MOV AH,9
- INT 21H
- MOV AX,PRT_NUM ; Point to Setup String
- MOV SI,30
- MUL SI
- ADD AX,OFFSET PGMSTR
- MOV BX,AX
- MOV CX,10 ; Set to 8/72" Line Spacing
- MOV SI,0
- CALL PARMOUT
- MOV CX,720/8 ; Printer Line Count
- MOV BX,BUFPTR ; Point to Buffer
- PRT_PIC1: PUSH CX
- PUSH BX
- MOV AX,PRT_NUM ; Prepare Printer for Graphics
- MOV SI,30
- MUL SI
- ADD AX,OFFSET PGMSTR
- MOV BX,AX
- MOV CX,10
- MOV SI,10
- CALL PARMOUT
- POP BX ; Get Buffer Pointer
- PUSH BX
- MOV CX,72 ; Printer Character Count
- MOV SI,0 ; Pointer = 0
- PRT_PIC2: PUSH CX
- PUSH BX
- PUSH SI
- MOV CX,8 ; 8 Scan Lines per Printer Line
- MOV DH,80H
- PRT_PIC3: PUSH CX
- PUSH BX
- MOV AL,0
- MOV CX,8
- MOV DL,80H
- PRT_PIC4: MOV AH,[BX][SI]
- AND AH,DH
- CMP AH,0
- JE PRT_PIC5
- OR AL,DL
- PRT_PIC5: SHR DL,1
- ADD BX,72
- LOOP PRT_PIC4
- PUSH DX
- CALL PRT_OUT ; Output Graphics to Printer
- POP DX
- POP BX
- POP CX
- SHR DH,1
- LOOP PRT_PIC3 ; Next Dot Position
- POP SI
- POP BX
- POP CX
- INC SI
- LOOP PRT_PIC2 ; Next Character Position
- MOV AL,13 ; Send CRLF to Printer
- CALL PRT_CHR
- MOV AL,10
- CALL PRT_CHR
- POP BX
- ADD BX,576
- POP CX
- CALL KEY_CHK ; If Keystroke, Abort
- LOOPZ PRT_PIC1 ; Next Printer Line
- MOV AX,PRT_NUM
- MOV SI,30
- MUL SI
- ADD AX,OFFSET PGMSTR
- MOV BX,AX
- MOV CX,10 ; Set to 1/6" Line Spacing
- MOV SI,20
- CALL PARMOUT
- MOV AL,13 ; Output CR to Printer
- CALL PRT_CHR
- MOV AL,12 ; Output FF to Printer
- CALL PRT_CHR
- POP DI ; Restore Registers
- POP SI
- POP DX
- POP CX
- POP BX
- POP AX
- RET ; Done
-
- PARMOUT: MOV AL,[BX][SI] ; Output Parameter String
- CMP AL,' ' ; to Printer
- JE PARMOUT1
- CALL PRT_CHR
- INC SI
- LOOP PARMOUT
- PARMOUT1: RET
-
- PRT_OUT: PUSH AX ; Save Registers
- PUSH BX
- PUSH CX
- PUSH DX
- MOV BX,PRT_NUM ; If Apple/NEC Printer,
- CMP BX,1
- JNE PRT_OUT2
- MOV CX,8 ; Transpose Data
- PRT_OUT1: RCR AL,1
- RCL AH,1
- LOOP PRT_OUT1
- MOV AL,AH
- PRT_OUT2: CALL PRT_CHR ; Output Data to Printer
- POP DX ; Restore Registers
- POP CX
- POP BX
- POP AX
- RET ; Done
-
- PRT_CHR: PUSH AX ; Save Registers
- PUSH DX
- MOV DX,0 ; Output Character to LPT1:
- MOV AH,0
- INT 17H
- AND AL,0A9H ; If Error, Say So
- JNZ PRT_CHR1
- CLC ; Clear Error Indicator
- POP DX ; Restore Registers
- POP AX
- RET ; Done
- PRT_CHR1: STC ; Set Error Indicator
- POP DX ; Restore Registers
- POP AX
- RET ; Done
-
- PIC_OUT: PUSH AX ; Save Registers
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH SI
- PUSH DI
- PUSH BP
- PUSH ES
- MOV AX,VIDEO ; Point to Video Segment
- MOV ES,AX
- COORD BP,0,0 ; Point to (0,0) in Video
- MOV AX,SCAN1 ; Point to First Scan Line
- MOV SI,72
- MUL SI
- ADD AX,BUFPTR
- MOV BX,AX
- MOV AX,SCRLEN ; Count = Number of Scan Groups
- DIV SCANCNT
- MOV CX,AX
- PIC_OUT1: PUSH CX
- MOV SI,0
- MOV DI,0
- MOV CX,72
- PIC_OUT2: MOV AL,[BX][SI] ; Output Byte 0 to Video 1
- XOR AL,0FFH
- MOV ES:[BP][DI],AL
- MOV AL,[BX][SI][72] ; Output Byte 72 to Video 2
- XOR AL,0FFH
- MOV ES:[BP][DI][2000H],AL
- CMP HERC,0
- JE PIC_OUT3
- MOV AL,[BX][SI][144] ; Output Byte 144 to Video 3
- XOR AL,0FFH
- MOV ES:[BP][DI][4000H],AL
- MOV AL,[BX][SI][216] ; Output Byte 216 to Video 4
- XOR AL,0FFH
- MOV ES:[BP][DI][6000H],AL
- PIC_OUT3: INC SI ; Repeat for Whole Line
- INC DI
- LOOP PIC_OUT2
- MOV AL,SCANCNT ; Repeat for Whole Screen
- MOV AH,72
- MUL AH
- ADD BX,AX
- MOV AX,LINLEN
- MOV CL,3
- SHR AX,CL
- ADD BP,AX
- POP CX
- LOOP PIC_OUT1
- POP ES ; Restore Registers
- POP BP
- POP DI
- POP SI
- POP DX
- POP CX
- POP BX
- POP AX
- RET ; Done
-
- OP_PICF: PUSH DX ; Save Register
- MOV DX,OFFSET FILN_BUF ; Open File For Reading
- MOV AX,3D00H
- INT 21H
- MOV HANDLE,AX ; Save Handle
- POP DX ; Restore Register
- RET ; Done
-
- RD_PICF: PUSH BX ; Save Registers
- PUSH CX
- PUSH DX
- MOV AH,3FH ; Read a Block to the IO Buffer
- MOV DX,OFFSET IOBUF
- MOV CX,8192
- MOV BX,HANDLE
- INT 21H
- MOV NEXT_PTR,0 ; Set Pointer to Start of Buffer
- CALL KEY_CHK ; Check for Keystroke
- POP DX ; Restore Registers
- POP CX
- POP BX
- RET ; Done
-
- CL_PICF: PUSH BX ; Save Register
- MOV BX,HANDLE ; Close File
- MOV AX,3E00H
- INT 21H
- POP BX ; Restore Register
- RET ; Done
-
- RD_OTHER: PUSH BX ; Save Registers
- PUSH CX
- PUSH DX
- MOV AX,3D00H ; Open OTHER.PRT
- MOV DX,OFFSET OTHER
- INT 21H
- MOV BX,AX ; Save File Handle
- JC NO_OTHER
- MOV AH,3FH ; Read Printer Info from File
- MOV CX,30
- MOV DX,OFFSET PGMOTHR
- INT 21H
- MOV AH,3EH ; Close OTHER.PRT
- INT 21H
- NO_OTHER: POP DX ; Restore Registers
- POP CX
- POP BX
- RET ; Done
-
- WR_OTHER: PUSH BX ; Save Registers
- PUSH CX
- PUSH DX
- MOV AH,3CH ; Create OTHER.PRT
- MOV CX,0
- MOV DX,OFFSET OTHER
- INT 21H
- MOV BX,AX ; Save File Handle
- MOV AH,40H ; Write Printer Info to File
- MOV CX,30
- MOV DX,OFFSET PGMOTHR
- INT 21H
- MOV AH,3EH ; Close OTHER.PRT
- INT 21H
- POP DX ; Restore Registers
- POP CX
- POP BX
- RET ; Done
-
- KEY_CHK: PUSH AX ; Save Register
- MOV AH,1 ; If Keystroke,
- INT 16H
- JZ KEY_CHK1
- MOV AH,0 ; Read the Key
- INT 16H
- CALL BRK_CHK ; If ^C or ^Break, Abort
- KEY_CHK1: POP AX ; Restore Register
- RET ; Done
-
- BRK_CHK: CMP AL,3 ; If ^C or ^Break,
- JE BRK_CHK1
- CMP AX,0
- JNE BRK_CHK2
- BRK_CHK1: CALL SET_TMOD ; Select Text Mode
- MOV AX,4C02H ; Exit to DOS
- INT 21H
- BRK_CHK2: RET
-
- SET_GMOD: CMP HERC,0 ; If Hercules,
- JE SET_GMD1
- MOV AL,2 ; Mode = Graphics
- MOV SI,OFFSET GMODE
- MOV BX,0
- MOV CX,16384
- CALL SET_MODE
- JMP SHORT SET_GMD2
- SET_GMD1: MOV AX,0006H ; Else Set Hi-Res Graphics Mode
- INT 10H
- MOV AX,0600H ; Clear Screen
- MOV BH,0
- COORD CX,0,0
- COORD DX,24,79
- INT 10H
- SET_GMD2: RET ; Done
-
- SET_TMOD: CMP HERC,0 ; If Hercules,
- JE SET_TMD1
- MOV AL,20H ; Mode = Text
- MOV SI,OFFSET TMODE
- MOV BX,' '+7*256
- MOV CX,2000
- CALL SET_MODE
- JMP SHORT SET_TMD2
- SET_TMD1: MOV AX,0002H ; Else Set 80x25 Mono Mode
- INT 10H
- MOV AX,0600H ; Clear Screen
- MOV BH,7
- COORD CX,0,0
- COORD DX,24,79
- INT 10H
- SET_TMD2: MOV AH,2 ; Home Cursor
- MOV BH,0
- MOV DX,0
- INT 10H
- RET ; Done
-
- SET_MODE: PUSH ES ; Save Registers
- PUSH AX
- PUSH BX
- PUSH CX
- MOV DX,BIOS
- MOV ES,DX
- MOV DX,3B8H ; Set Display Mode of Operation
- OUT DX,AL
- MOV ES:CRTMODE,AL
- MOV DX,3B4H ; Point to Index Register
- MOV CX,12 ; Parameter Count = 12
- XOR AH,AH ; First Parameter = 0
- SET_MOD1: MOV AL,AH ; Set up Parameter Number
- OUT DX,AL
- INC DX ; Point to Data Register
- LODSB ; Read Parameter
- OUT DX,AL ; Output Paramter to Video
- INC AH ; Next Parameter
- DEC DX ; Point to Index Register
- LOOP SET_MOD1 ; Repeat for all Parameters
- MOV AX,VIDEO ; Clear Screen
- MOV ES,AX
- XOR DI,DI
- POP CX ; Restore Registers
- POP AX
- CLD
- REP STOSW
- POP AX
- OR AL,8
- MOV DX,BIOS
- MOV ES,DX
- MOV DX,3B8H ; Activate the Screen
- OUT DX,AL
- MOV ES:CRTMODE,AL
- POP ES ; Restore Registers
- RET ; Done
-
- IOBUF LABEL BYTE
-
- CODE ENDS
-
- END START
-